package org.example.study2;
//指定线程名

public class Demo_202 {
    public static void main(String[] args) throws Exception {
        // 创建线程 t1（未启动）, t1 线程使用默认名称（Thread-0）
        Thread t1 = new Thread(() -> {
            while (true) {
                System.out.println(Thread.currentThread().getName() + " hello thread...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        // 启动t1
//        t1.start();

        // 创建线程 t2 并通过构造函数的第二个参数指定线程名,t2 线程名称为"我是一个线程"
        Thread t2 = new Thread(() -> {
            while (true) {
                // 获取当前类全限定名（org.example.study2.Demo_202）
                String cName = Demo_202.class.getName();
                // 通过堆栈跟踪获取当前执行的方法名
                String mName = Thread.currentThread().getStackTrace()[1].getMethodName();
                // 获取当前线程对象
                Thread thread = Thread.currentThread();
                // 获取线程名称（构造时指定的"我是一个线程"）
                String tName = thread.getName();
                // 格式化输出调试信息
                System.out.println("当前类：" + cName + ", 当前方法：" + mName + ", 当前线程：" + tName);
                try {
                    Thread.sleep(1000);// 线程休眠1秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "我是一个线程");// 第二个参数指定线程名称
        // 启动 t2 线程
        t2.start();
    }
}

/*
输出：
        当前类：org.example.study2.Demo_202, 当前方法：lambda$main$1, 当前线程：我是一个线程
        当前类：org.example.study2.Demo_202, 当前方法：lambda$main$1, 当前线程：我是一个线程
        当前类：org.example.study2.Demo_202, 当前方法：lambda$main$1, 当前线程：我是一个线程
        当前类：org.example.study2.Demo_202, 当前方法：lambda$main$1, 当前线程：我是一个线程
        。。。。。。。*/
